#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <err.h>
#include "environment.h"



/*开辟编译器运行时环境所需的数据结构内存, 压入堆栈*/
Environment *environment_new(){
   Environment *env = malloc(sizeof(Environment));
   env->size = 0;
   env->items = NULL;
   return env;
}

//新建变量后，移动指针头首地址
void environment_set_offset(Environment *env,char *var_name, int offset ){
    env->size++;
    //realloc可以对给定的指针所指的空间进行扩大或者缩小,对于缩小，则被缩小的那一部分的内容会丢失!!
    env->items = realloc(env->items, env->size * sizeof(VarWithOffset));
    /*
    vwo： 表示结构体变量env* 型的一级指针变量空间，里面存放的是结构体变量env的地址
    *vwo：表示vwo所指向的空间，指的就是  结构体变量env 的空间，只不过是通过地址找到的
    &vwo：表示指针变量vwo自己的空间地址，它需要一个env** 的2级指针变量来存放
    避免使用 多级指针，因为容易断链，如果非要使用，必须注意指针链是否完整，避免访问到空指针，野指针
    避免使用野指针，定义指针变量时，一定将其赋值为NULL
    */
    VarWithOffset *vwo  = &env->items[env->size -1];
    //获取新建变量开辟新内存后首地址
    vwo->offset = offset;

}

//返回某变量占据的内存的首地址
int environment_get_offset(Environment *env, char *var_name){
    VarWithOffset vwo;
  
    // size_t 是在catddef头文件中定义的机器相关的无符号整型，该类型足以保存最大数组长度

    for(size_t i=0; i<env->size; i++){
        vwo = env->items[i];
        if(strcmp(vwo.var_name, var_name)==0){
            //返回某变量占据的内存空间
            return vwo.offset;
        }
    }
    warnx("在堆栈中无法找到变量 %s ", var_name);
    return -1;
}

//释放堆栈中全部内存
void environment_free(Environment *env){
    if(env != NULL){
        free(env->items);
        free(env);
    }
}
